Automatic Generation of Gauss Filter

Formula


H(i,j) = (1 / 2pi sigma^2) e^{[(i-k-1)^2 + (j-k-1)^2] / (2*sigma^2)}

The size of the filter is 2k+1 and (i, j) represents a position in the coordinate. The origin of coordinate is the central position of the filter. Pi is circumference ratio and sigma is standard deviation.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
ElementType** malloc2DArray(int nRow, int nColumn)
{
ElementType **filter = (ElementType**)malloc(sizeof(ElementType*)*nRow);
for (int y = 0;y < nRow;y++) {
*(filter+y) = (ElementType*)malloc(sizeof(ElementType)*nColumn);
}
return filter;
}
ElementType** makeGaussianFilter(int size, ElementType sigma)
{
ElementType** filter = malloc2DArray(size, size);
int center = (size - 1) / 2;
ElementType sum = 0;
ElementType x2 = 0;
ElementType y2 = 0;
for (int y = 0;y < size;y++)
{
x2 = pow(ElementType(y-center), 2);
for (int x = 0;x < size;x++)
{
y2 = pow(ElementType(x-center), 2);
*(*(filter+y)+x) = exp(-(x2+y2) / (2*sigma*sigma));
sum += *(*(filter+y)+x);
}
}
if (0.0 != sum)
{
for (int y = 0;y < size;y++)
{
for (int x = 0;x < size;x++) {
*(*(filter+y)+x) /= sum;
}
}
}
return filter;
}
ElementType* GaussianFilter(int size, ElementType sigma)
{
if (!(size%2)) {
size += 1;
}
ElementType **filter2D = makeGaussianFilter(size, sigma);
ElementType *filter = (ElementType*)malloc(sizeof(ElementType)*size*size);
for (int y = 0;y < size;y++)
{
for (int x = 0;x < size;x++) {
*(filter+y*size+x) = *(*(filter2D+y)+x);
}
}
return filter;
}